package com.angus.common.core.utils.uuid;

import cn.hutool.core.util.RandomUtil;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * ID生成器工具类
 * 
 * @author ruoyi
 */
public class IdUtils
{
    private static final Set<String> usedOrderIds = new HashSet<>();
    /**
     * 获取随机UUID
     * 
     * @return 随机UUID
     */
    public static String randomUUID()
    {
        return UUID.randomUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线
     * 
     * @return 简化的UUID，去掉了横线
     */
    public static String simpleUUID()
    {
        return UUID.randomUUID().toString(true);
    }

    /**
     * 获取随机UUID，使用性能更好的ThreadLocalRandom生成UUID
     * 
     * @return 随机UUID
     */
    public static String fastUUID()
    {
        return UUID.fastUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线，使用性能更好的ThreadLocalRandom生成UUID
     * 
     * @return 简化的UUID，去掉了横线
     */
    public static String fastSimpleUUID()
    {
        return UUID.fastUUID().toString(true);
    }


    // 生成订单ID
    public static synchronized String generateOrderId() {
        StringBuilder orderId = new StringBuilder();
        String fullId = "";

        // 获取当前时间戳并格式化
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String timestamp = dateFormat.format(new Date());

        // 确保时间戳长度为15位
        if (timestamp.length() > 13) {
            timestamp = timestamp.substring(0, 13);
        }

        // 添加固定前缀
        orderId.append("WS");

        // 剩余部分需要生成2位数字或字母
        Random random = new Random();
        while (true) {
            // 生成2位数字或字母
            for (int i = 0; i < 2; i++) {
                if (random.nextDouble() < 0.78) {
                    orderId.append(random.nextInt(10)); // 生成0-9之间的数字
                } else {
                    orderId.append((char) ('A' + random.nextInt(26))); // 生成A-Z之间的字母
                }
            }

            // 拼接时间戳
            fullId = orderId + timestamp;
            if (!usedOrderIds.contains(fullId)) {
                usedOrderIds.add(fullId);
                break;
            }

            // 清空StringBuilder重新生成
            orderId.setLength(0);
            orderId.append("WS");
        }
        return fullId;

    }


    /**
     * 生成一个由大写字母和数字组成的指定长度的随机字符串
     * @param length 字符串长度
     * @return 随机字符串
     */
    public static String generateAlphanumericStr(int length) {
        List<Character> characters = new ArrayList<>();
        for (int i = 0; i < length / 2; i++) {
            characters.add((char) ('A' + RandomUtil.randomInt(26))); // 大写字母
            characters.add((char) ('0' + RandomUtil.randomInt(10))); // 数字
        }

        if (length % 2 != 0) {
            characters.add((char) ('A' + RandomUtil.randomInt(26))); // 如果长度为奇数，再添加一个大写字母
        }

        Collections.shuffle(characters); // 打乱顺序

        StringBuilder sb = new StringBuilder();
        for (Character ch : characters) {
            sb.append(ch);
        }

        return sb.toString();
    }



}
